/**
 * 不用说了，就是计时器
 * 逻辑部分, 没有 UI 部分
 */

class MyTimer {
  /**
   * 有没有在跑
   */
  playing = false;

  /**
   * 基准时间 timestamp
   */
  baseTime = 0;

  /**
   * 现在计时器的值 (计时器在暂停时), 单位 0.1s
   * 
   * 该值 >= 0 表示在暂停
   */
  pauseDelta = -1;
  /**
   * 计算现在计时器的值 (计时器在动时), 单位 0.1s
   */
  delta = 0;

  // 其它时间显示数字
  ds = 0;
  s = 0;
  m = 0;
  h = 0;

  tick() {
    if (!this.playing) {
      this.delta = 0;
      this.ds = 0;
      this.s = 0;
      this.m = 0;
      this.h = 0;
      return;
    }
    if (this.pauseDelta >= 0) {
      return;
    }

    this.delta = parseInt((new Date().getTime() - this.baseTime) / 100); // 0.1 秒
    this.calc();
  };

  /**
   * 计算 ds、s、m、h 的值
   */
  calc() {
    this.ds = parseInt(this.delta % 10);
    this.s = parseInt((this.delta % 600) / 10);

    // minute
    if (this.delta >= 600) {
      this.m = parseInt((this.delta % 36000) / 600);
    } else {
      this.m = 0;
    }

    // hour
    if (this.delta >= 36000) {
      this.h = parseInt(this.delta / 36000);
    } else {
      this.h = 0;
    }
  };

  /**
   * @returns {boolean} 启动是否成功
   *   失败意味着该计时器可能已经在跑了
   */
  start() {
    if (this.playing && this.pauseDelta < 0) {
      return false;
    }
    if (!this.playing) { // 从 0 启动
      this.baseTime = new Date().getTime();
      this.playing = true;
    }
    if (this.pauseDelta >= 0) { // 从暂停中恢复
      this.baseTime = new Date().getTime() - (100 * this.pauseDelta);
      this.pauseDelta = -1;
    }
    return true;
  };

  /**
   * pause 和 stop 是同一个方法
   * @param {number} value 停止时的示数. 可以为 null
   * @returns {boolean} 停止是否成功
   *   失败意味着该计时器可能已经停止了
   */
  pause(value) {
    if (!this.playing) {
      return false;
    }

    if (value == null) {
      this.pauseDelta = this.delta;
    } else {
      this.pauseDelta = this.delta = value;
      this.baseTime = new Date().getTime() - (100 * value);
      this.calc();
    }
    return true;
  };

  reset(value) {
    if (value == null || typeof(value) != 'number' || value < 0) {
      value = 0;
    }

    this.baseTime = 0;
    if (value == 0) { // 重置为 0, 而且到未启动状态
      this.playing = false;
      this.pauseDelta = -1;
      this.delta = 0;
    } else { // 重置为指定数值, 而且暂停
      this.playing = true;
      this.delta = this.pauseDelta = value;
    }
    this.calc();
  };

  undoPause(value) {
    if (this.playing && this.pauseDelta < 0) {
      return false;
    }
    if (this.playing == false) {
      return false;
    }

    if (value != null) {
      this.baseTime = new Date().getTime() - (100 * value);
    }

    this.playing = true;
    this.pauseDelta = -1;
    this.delta = parseInt((new Date().getTime() - this.baseTime) / 100); // 0.1 秒
    this.calc();
    return true;
  };
}

export default MyTimer;
